﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.IO;
using produccion.vistamodelo;
using System.ComponentModel;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMprematp.xaml
    /// </summary>
    public partial class FRMprematp : Window
    {
        prematp _prematp;

        public FRMprematp()
        {
            InitializeComponent();
            _prematp = (prematp)this.DataContext;
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            _prematp.guardar(wPnot);
            texCod.Focus();
            texCod.Select(0, 0);
        }

        string camb;
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {

            if (_prematp.materiP.CODMAT_MAT != camb)
            {
                if (_prematp.materiP.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                    {
                        _prematp.materiP.CODMAT_MAT = camb;
                        return;
                    }
                    _prematp.materiP.CAMBIO = false;
                }
                camb = _prematp.materiP.CODMAT_MAT;
                _prematp.Consultar();

                _prematp.visorFotoReferencia.strCodigo = texCod.Text;

                if (!_prematp.materiP.EXISTE)
                {
                   _prematp.preMatp.Clear();
                   dtLisPre.Columns.Clear();
                   _prematp.materiP.CAMBIO = false;
                }
            }
       }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }

        private void dtLisPre_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.Column.Header.ToString() == "Codigo_color")
            {
                    e.Cancel = true;
            }

            if (e.Column.Header.ToString() != "Codigo_color" && e.Column.Header.ToString() != "Color")
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,##.##}";
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();
            }

            if (_prematp.editColumna(e.Column.Header.ToString()))
            {
                e.Column.IsReadOnly = true;
                DataGridBoundColumn c = (DataGridBoundColumn)e.Column;
                c.CellStyle = (Style)FindResource("estilo");
            }
            else 
            {
                Binding binding = (Binding)((DataGridBoundColumn)e.Column).Binding;
                binding.ValidationRules.Add(new ReglasValidacion.esOKdecimal { Maxc = 15, Minc = 0, Maxv = "*", Minv = "*", Posd = "13" });
                //binding.Converter=new ReglasFormato.FormatoDecimal();
                binding.ValidatesOnDataErrors = true;
                binding.ValidatesOnExceptions = true;
                binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                DataGridBoundColumn c = (DataGridBoundColumn)e.Column;
                c.EditingElementStyle = (Style)FindResource("styTxtError");
            }
        }

        private void bRepetir_Click(object sender, RoutedEventArgs e)
        {
            if (dtLisPre.SelectedIndex>-1)
            {
                _prematp.RepeTir(nombreCol, dtLisPre.SelectedIndex);
            }
        }

        string nombreCol;
        private void dtLisPre_CurrentCellChanged(object sender, EventArgs e)
        {
            if (dtLisPre.CurrentCell.Column != null)
            {
                nombreCol = dtLisPre.CurrentCell.Column.Header.ToString();
            }
        }

        private void dtLisPre_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            _prematp.materiP.CAMBIO = true;
        }

        
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (_prematp.materiP.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else 
                {
                    _prematp.materiP.CAMBIO = false;
                }
            }
        }

        private void buscMat(object sender, RoutedEventArgs e)
        {
            FRMBuscarCol f = new FRMBuscarCol();
            f.EsReferencia = false;
            f.RequiereColor = false;
            f.Retorno = "";
            f.ShowDialog();

            if (!f.Retorno.Equals(""))
            {
                texCod.Text = f.Retorno;
                return;
            }
            if (texCod.Text == f.Retorno)
            {
                texCod_TextChanged(null, null);
            }
        }

        private void dtLisPre_LostFocus(object sender, RoutedEventArgs e)
        {
            Boolean errors = (from c in
                                  (from object i in dtLisPre.ItemsSource
                                   select dtLisPre.ItemContainerGenerator.ContainerFromItem(i))
                              where c != null
                              select Validation.GetHasError(c)).FirstOrDefault(x => x);

            _prematp.ERROR = errors;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Keyboard.Focus(texCod);
        }

        private void dtLisPre_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

     }

    internal class prematp:ObservableObject
    {

        #region propiedades

        //-----------------------------------------------------------------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private VMbuscarGeneral _buscarMateriaPrima;
        
        public VMbuscarGeneral buscarMateriaPrima
        {
            get { return _buscarMateriaPrima; }
            set { _buscarMateriaPrima = value; RaisePropertyChangedEvent("buscarMateriaPrima"); }
        }

        //Enlaza los campos de texto para mostrar la descripccion de la materia prima
        private clases.CLSMAEMAT _materiP = new clases.CLSMAEMAT();
        public clases.CLSMAEMAT materiP 
        {
            get { return _materiP; }
            set { _materiP = value; RaisePropertyChangedEvent("materiP"); }
        }

        //Enlaza el DataGrid con la informacion requerida
        private DataTable _preMatp=new DataTable();
        public DataTable preMatp 
        {
            get { return _preMatp; }
            set { _preMatp =value; RaisePropertyChangedEvent("preMatp"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; RaisePropertyChangedEvent("visorFotoReferencia"); }
        }

        //Lista de precios
        private clases.CLSPREMTPP _lisPre = new clases.CLSPREMTPP();
        public clases.CLSPREMTPP lisPre
        {
            get { return _lisPre; }
            set { _lisPre = value; RaisePropertyChangedEvent("lisPre"); }
        }

        private List<clases.CLSPREMTPP> _cambLisPre = new List<clases.CLSPREMTPP>();
        public  List<clases.CLSPREMTPP> cambLisPre
        {
            get { return _cambLisPre; }
            set { _cambLisPre = value; RaisePropertyChangedEvent("cambLisPre"); }
        }

        public DataTable valoresLispre = new DataTable();

        //Error DataGrid
        Boolean _ERROR = false;
        public Boolean ERROR
        {
            get { return _ERROR; }
            set { _ERROR = value; RaisePropertyChangedEvent("ERROR"); }
        }

        #endregion

        //-----------------------------------------------------------------------
        public prematp()
        {
            cargarMateriasPrimas();
            MDOgeneral.conectar();
            strTituloVentana = "Actualización de precios de materia prima - Usuario: " + MDOgeneral.usuario + " - [FRMprematp]";
        }

        void cargarMateriasPrimas()
        {
            try
            {
                List<clases.CLSMAEMAT> lismateriasprimas = new clases.CLSMAEMAT().LisMateriales();
                _buscarMateriaPrima = new VMbuscarGeneral((from mat in lismateriasprimas select new
                    VMlistaGenerica { strColumna1 = mat.CODMAT_MAT, strColumna2 = mat.NOMMAT_MAT, strColumna3 = mat.CODGRP_MAT, strColumna4 = mat.CODSUB_MAT }).ToList());
                buscarMateriaPrima.PropertyChanged += onBuscarMateriaPrimaPropertychanged;
                buscarMateriaPrima.gridBuscar.columna1.strNombre = "Código";
                buscarMateriaPrima.gridBuscar.columna2.strNombre = "Nombre Materia Prima";
                buscarMateriaPrima.gridBuscar.columna3.strNombre = "Grupo";
                buscarMateriaPrima.gridBuscar.columna4.strNombre = "Subgrupo";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarMateriaPrimaPropertychanged(object sender,  PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarMateriaPrima.IsOpen)
                    {
                        if (buscarMateriaPrima.gridBuscar.selLista != null)
                        {
                            materiP.CODMAT_MAT = buscarMateriaPrima.gridBuscar.selLista.strColumna1;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarMateriaPrima;
        public ICommand cmdBuscarMateriaPrima
        {
            get
            {
                if (_cmdBuscarMateriaPrima == null)
                {
                    _cmdBuscarMateriaPrima = new RelayCommand(r => buscar_MateriaPrima());
                }
                return _cmdBuscarMateriaPrima;
            }
        }

        private void buscar_MateriaPrima()
        {
            try
            {
                buscarMateriaPrima.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #region metodos

        public void Consultar() 
        {
            materiP.Consultar();
            if (materiP.EXISTE)
            {
                lisPre.CODMAT_PMP = materiP.CODMAT_MAT;
                valoresLispre = lisPre.conLisPre();
                formListPrecio();
            }
            else 
            {
                preMatp.Clear();
            }
        }

        private void formListPrecio() 
        {
            preMatp.Clear();

            DataView valores = valoresLispre.DefaultView;
            valores.Sort = "TIPLIS_PRE,CODLIS_PRE ASC";
            
            DataTable estrucutura = new DataTable();
            estrucutura.Columns.Add("Codigo_color", typeof(string));
            estrucutura.Columns.Add("Color", typeof(string));

            string lista="";
            for (int i = 0; i <= valores.Count-1; i++) 
            {
                if (lista.Equals(""))
                {
                    lista = valores[i]["NOMLIS_PRE"].ToString();
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        estrucutura.Columns.Add("("+valores[i]["CODLIS_PRE"].ToString()+") "+lista, typeof(double));
                    }
                }
                if (!lista.Equals(valores[i]["NOMLIS_PRE"].ToString())) 
                {
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        lista = valores[i]["NOMLIS_PRE"].ToString();
                        estrucutura.Columns.Add("(" + valores[i]["CODLIS_PRE"].ToString() + ") " + lista, typeof(double));
                    }
                }
            }

            valores.Sort = "CODCOL_MTP DESC";
            string color = "";
            int c=0;
            DataRow r;
            for (int i = 0; i <= valores.Count-1; i++) 
            {
                if (valores[i]["CODCOL_MTP"].ToString().Equals("")) { break; }
                if (color.Equals("")) 
                { 
                    c = 0;
                    r = estrucutura.NewRow();
                    color = valores[i]["CODCOL_MTP"].ToString();
                    r["Codigo_color"] = valores[i]["CODCOL_MTP"].ToString();
                    r["Color"] = valores[i]["NOMCOL"].ToString();
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        //r["("+valores[i]["CODLIS_PRE"].ToString()+") "+valores[i]["NOMLIS_PRE"].ToString()] = valores[i]["VALOR_PMP"].ToString();
                        r["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = Convert.ToDouble(valores[i]["VALOR_PMP"]);
                    }
                    estrucutura.Rows.Add(r);
                }
                if (color != valores[i]["CODCOL_MTP"].ToString())
                {
                    c++;
                    r = estrucutura.NewRow();
                    color = valores[i]["CODCOL_MTP"].ToString();
                    r["Codigo_color"] = valores[i]["CODCOL_MTP"].ToString();
                    r["Color"] = valores[i]["NOMCOL"].ToString();
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        //r["("+valores[i]["CODLIS_PRE"].ToString() +") "+ valores[i]["NOMLIS_PRE"].ToString()] = valores[i]["VALOR_PMP"].ToString();
                        r["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = Convert.ToDouble(valores[i]["VALOR_PMP"]);
                    }
                    estrucutura.Rows.Add(r);
                }
                else 
                {
                    estrucutura.Rows[c]["Codigo_color"] = valores[i]["CODCOL_MTP"].ToString();
                    estrucutura.Rows[c]["Color"] = valores[i]["NOMCOL"].ToString();
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        //estrucutura.Rows[c]["("+valores[i]["CODLIS_PRE"].ToString()+") "+valores[i]["NOMLIS_PRE"].ToString()] = valores[i]["VALOR_PMP"].ToString();
                        estrucutura.Rows[c]["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = Convert.ToDouble(valores[i]["VALOR_PMP"]);
                    }
                }
            }
            preMatp = estrucutura;
            preMatp.AcceptChanges();
        }

        public Boolean editColumna(string nombre) 
        {
            nombre = nombre.Split(' ')[0].Replace("(", "").Replace(")", "");
            DataRow[] r;
            r = valoresLispre.Select("CODLIS_PRE='" + nombre + "'");
            if (r.Length != 0)
            {
                if (r[0]["TIPLIS_PRE"].ToString() == "C")
                {
                    return true;
                }
            }
            else 
            {
                return true;
            }
            return false;
        }

        public void RepeTir(string nombre,int index) 
        {
            if (!editColumna(nombre)) 
            {
                string valor=preMatp.Rows[index][nombre].ToString();
                for (int i = index+1; i <= preMatp.Rows.Count-1; i++) 
                {
                    preMatp.Rows[i][nombre] = valor;
                }
            }
        }

        public void guardar(WrapPanel wPnot)
        {
            try
            {
                if (materiP.EXISTE)
                {
                    formCamLisPre();
                    if (lisPre.guardar(cambLisPre) > 0)
                    {
                        materiP.CAMBIO = false;
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void formCamLisPre() 
        {
            clases.CLSPREMTPP fila = new clases.CLSPREMTPP();
          
            for (int i = 0; i <= preMatp.Rows.Count - 1;i++)
            {
                if (preMatp.Rows[i].RowState == DataRowState.Modified)
                {
                    for (int j = 0; j <= preMatp.Columns.Count - 1; j++)
                    {

                        if (!editColumna(preMatp.Columns[j].ColumnName))
                        {
                            if (preMatp.Rows[i][j].ToString() == "")
                            {
                                preMatp.Rows[i][j] = "0";
                            }
                            fila = new clases.CLSPREMTPP
                            {
                                CODLIS_PMP = preMatp.Columns[j].ColumnName.Split(' ')[0].Replace("(", "").Replace(")", ""),
                                CODMAT_PMP = materiP.CODMAT_MAT,
                                CODCOL_PMP = preMatp.Rows[i]["Codigo_color"].ToString(),
                                VALOR_PMP = Convert.ToDouble(preMatp.Rows[i][j])
                            };
                            cambLisPre.Add(fila);                            
                        }
                    }
                }
            }
        }
        
        #endregion

    }
}
    